package model

import (
	"code.project.com/chatroom/common/message"
	"encoding/json"
	"fmt"
	"github.com/garyburd/redigo/redis"
)

// 创建一个全局的userDao实例
var (
	MyUserDao *UserDao
)

// 定义一个UserDao的结构体  完成对user的各种操作
type UserDao struct {
	pool *redis.Pool
}

func NewUserDao(pool *redis.Pool) (userDao *UserDao) {
	userDao = &UserDao{
		pool: pool,
	}
	return
}

// userDao应该提供哪些方法

//  1. 根据用户id 返回一个User实例 + err
func (u *UserDao) getUserById(conn redis.Conn, id int) (user *User, err error) {
	// 通过给定的id去redis查询用户
	res, err := redis.String(conn.Do("HGet", "users", id))
	if err != nil {
		if err == redis.ErrNil { // 表示在users 哈希中没有找到对应的id
			err = ERROR_USER_NOTEXISTS
		}
		return
	}

	// 这里我们需要把 res 反序列化User实例
	err = json.Unmarshal([]byte(res), &user)
	if err != nil {
		fmt.Println("json反序列化出错err= ", err)
		return
	}
	return
}

// 完成登录的校验
// 1. login 完成对用户的验证
//2. 如果用户的id和pwd都正确
func (u *UserDao) Login(userId int, userPwd string) (user *User, err error) {
	// 先UserDao 的连接池中取出一根链接
	conn := u.pool.Get()

	defer conn.Close()
	user, err = u.getUserById(conn, userId)
	if err != nil {
		return
	}

	// 这时候这个用户是获取到
	if user.UserPwd != userPwd {
		err = ERROR_USER_PWD
		return
	}
	return
}

func (u *UserDao) Register(user *message.User) (err error) {
	// 先UserDao 的连接池中取出一根链接
	conn := u.pool.Get()

	defer conn.Close()
	// 查询是否注册
	_, err = u.getUserById(conn, user.UserId)
	if err == nil {  // 没有错误表示能取到这个用户id
		err = ERROR_USER_EXISTS
		return
	}

	// 这时候这个userId 还没有注册
	data,err := json.Marshal(user)
	if err != nil {
		return
	}

	// 保存注册用户
	_, err = conn.Do("HSet","users",user.UserId,string(data))
	if err != nil {
		fmt.Println("保存注册用户错误,err=",err)
		return
	}
	return
}
